// 给定两个整数，分别表示分数的分子 numerator 和分母 denominator，以字符串形式返回小数。

// 如果小数部分为循环小数，则将循环的部分括在括号内。

// 示例 1:

// 输入: numerator = 1, denominator = 2
// 输出: "0.5"
// 示例 2:

// 输入: numerator = 2, denominator = 1
// 输出: "2"
// 示例 3:

// 输入: numerator = 2, denominator = 3
// 输出: "0.(6)"

#include <string>
#include <unordered_map>

using namespace std;

class Solution {
public:
    string fractionToDecimal(int numerator, int denominator) {
        int s1 = numerator >= 0 ? 1 : -1;
        int s2 = denominator >= 0 ? 1 : -1;
        long long num = abs(static_cast<long long>(numerator));
        long long den = abs(static_cast<long long>(denominator));
        long long out = num / den; // 商
        long long rem = num % den; // 余数
        unordered_map<long long, int> m;
        string res = to_string(out);
        if (s1 * s2 == -1 && (out > 0 || rem > 0)) res = "-" + res; // 判断是否是负数
        if (rem == 0) return res;
        res += ".";
        string s = "";
        int pos = 0;
        while (rem != 0) {
            if (m.find(rem) != m.end()) { // 已经存在
                s.insert(m[rem], "(");
                s += ")";
                return res + s;
            }
            // 要算出小数每一位，采取的方法是每次把余数乘10，再除以除数，得到的商即为小数的下一位数字。
            m[rem] = pos;
            s += to_string((rem * 10) / den);
            rem = (rem * 10) % den;
            ++pos;
        }
        return res + s;
    }
};